﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RiskMan.Config;
using RiskMan.DataClass.Models.Quik;
using XlDde;
using RiskMan.DataClass.Models;
using System.Windows.Forms;
using RiskMan.Views.Dialogs;
using System.Reflection;

namespace RiskMan.Providers.Channels
{
    class DDEChannelDealList : XlDdeChannel
    {
        private List<DealModel> list;

        public DDEChannelDealList()
        {
        }
        protected override void ProcessTable(XlTable xt, string topic)
        {
            list = RiskMan.MainWindow.StaticRiskMan._dataProvider.DealList;
            try
            {
                for (int i = 0; i < xt.Rows; i++)
                {
                    string data = "";
                    DealModel dl = new DealModel();
                    List<String> names = new List<String>();

                    for (int j = 0; j < xt.Columns; j++)
                    {
                        xt.ReadValue();

                        if (Namespace.Count == 0 && i == 0)
                        {
                            dl = null;
                            names.Add(xt.StringValue);
                        }
                        else
                        {
                            if (IsSend(xt) == true)
                            {
                                try
                                {
                                    if ( Namespace [ j ] == "TRADEDATE" ) data = xt.StringValue;
                                    if ( Namespace [ j ] == "TRADETIME" )
                                    {
                                        data += " " + xt.StringValue;
                                        dl.DateTrade = Convert.ToDateTime( data );
                                    }
                                    if ( Namespace [ j ] == "ORDERNUM" ) dl.Order = ( long ) xt.FloatValue;
                                    if ( Namespace [ j ] == "CLASSCODE" ) dl.ClassCode = xt.StringValue;

                                    if ( Namespace [ j ] == "SECCODE" ) dl.Seccode = xt.StringValue;
                                    if ( Namespace [ j ] == "BUYSELL" )
                                        if ( xt.StringValue == "BUY" )
                                            dl.Operation = cfg.Buy;
                                        else
                                            dl.Operation = cfg.Sell;
                                    if ( Namespace [ j ] == "ACCOUNT" ) dl.Account = xt.StringValue;
                                    if ( Namespace [ j ] == "PRICE" ) dl.Price = xt.FloatValue;
                                    if ( Namespace [ j ] == "QTY" ) dl.Count = ( int ) xt.FloatValue;
                                    if ( Namespace [ j ] == "BROKERREF" ) dl.Comment = xt.StringValue;
                                    if ( Namespace [ j ] == "CLIENTCODE" ) dl.ClientCode = xt.StringValue;
                                    if ( Namespace [ j ] == "VALUE" ) dl.Volume = xt.FloatValue;
                                }
                                catch ( ArgumentOutOfRangeException )
                                {

                                    string message = "\"Таблица сделок\" в разных терминалах настроены по разному. \n\r" +
                                        "Для правильной настройки таблице ознакомьтесь с инструкцией." +
                                        "\n\rНеобходимо чтоб название и количество выводимых параметров совпадало.";
                                    string title = "Ошибка";

                                    if ( base.IsShowMessage == false )
                                    {
                                        base.IsShowMessage = true;
                                        new DialogMessage( message, title );
                                    }
                                    cfg.SetLog( message, RiskMan.MainWindow.StaticRiskMan.ListBox_Logs, GetType(), MethodBase.GetCurrentMethod());
                                }
                                catch ( Exception ex )
                                {
                                    new DialogMessage( ex.Message, "DDEChannelDealList" );
                                }
                            }
                            else
                            {
                                dl = null;
                            }
                        }
                    }
                    if (dl != null)
                        list.Add(dl);

                    if (names.Count > 0)
                        Namespace = new List<String>(names);
                }
            }
            catch (Exception ex)
            {
                new DialogOkCancel( ex.Message, "DDEChannelDealList" );
            }
        }


        public override void Disconnected(bool isConnected)
        {
            Namespace.Clear();
            QuikIntegration.dde.QuikUtil.StartDDE();
        }
    }
}
